package com.ruoyi.system.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.UserAgentUtil;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.system.domain.SysLoginCheck;
import com.ruoyi.system.domain.SysLoginCheckConfig;
import com.ruoyi.system.mapper.SysLoginCheckConfigDao;
import com.ruoyi.system.mapper.SysLoginCheckDao;
import cz.mallat.uasparser.UserAgentInfo;
import eu.bitwalker.useragentutils.UserAgent;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 登陆设备限制
 * @author chengjian 
 * @date 2021/10/19
 */
@Service
public class SysCheckLoginServiceImpl {
    @Resource
    private SysLoginCheckConfigDao sysLoginCheckConfigDao;

    @Resource
    private SysLoginCheckDao sysLoginCheckDao;

    /**
     * 校验设备
     * @author chengjian
     * @date 2021/10/19 2:43 下午
     * @param loginUser 登陆用户信息
     * @param extendCode 扩展码SmsUtil
     * @param unionId 电脑设备唯一id
     */
    public AjaxResult handleCheckLogin(LoginUser loginUser, String extendCode, String unionId){
        String username = loginUser.getUser().getUserName();
        UserAgentInfo userAgentInfo = UserAgentUtil.getUserAgentInfo(ServletUtils.getRequest().getHeader("User-Agent"));
        if (userAgentInfo == null){
            throw new ServiceException("系统解析数据失败，请稍后重拾！");
        }


        final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
        String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
        // 获取客户端操作系统
        String os = userAgent.getOperatingSystem().getName();
        // 获取客户端浏览器
        String browser = userAgentInfo.getUaName();
        // 获取客户端浏览器类型
        String type = userAgentInfo.getType();
        String ob = os + "-" + browser + "-" + type;
        SysLoginCheck check = sysLoginCheckDao.selectOne(new LambdaQueryWrapper<SysLoginCheck>()
                .eq(SysLoginCheck::getUsername,username)
                .eq(SysLoginCheck::getOb,ob)
                .eq(SysLoginCheck::getIp,ip));

        // 该设备第一次登陆，没有设备登陆日志
        if (check == null){
            // 校验次数
            List<SysLoginCheck> list = sysLoginCheckDao.selectList(new LambdaQueryWrapper<SysLoginCheck>().eq(SysLoginCheck::getUsername,username));
            if (CollUtil.isEmpty(list)){
                // 该账号第一次登陆，通过，添加访问设备
                SysLoginCheck checkData = new SysLoginCheck(username,ob,ip);
                sysLoginCheckDao.insert(checkData);
            } else {
                int size = list.size();
                SysLoginCheckConfig config = sysLoginCheckConfigDao.selectOne(new LambdaQueryWrapper<SysLoginCheckConfig>().eq(SysLoginCheckConfig::getUsername,username));
                if (config == null){
                    // 自动添加默认配置
                    config = new SysLoginCheckConfig(username,1);
                    sysLoginCheckConfigDao.insert(config);
                }

                // 拒绝登陆成功
                if (config.getAgreeNum() <= size){
                    return AjaxResult.error("该账号不允许在暗黑势力下登陆，请前往光明顶！");
                }

                if (StringUtils.isEmpty(extendCode)){
                    return AjaxResult.error("请你输入正确的扩展码！");
                }

                if (!extendCode.equals(config.getExtendCode())){
                    return AjaxResult.error("该账号输入扩展码错误!");
                }

                config.setExtendCode("");
                config.setUpdateTime(null);
                sysLoginCheckConfigDao.updateById(config);

                SysLoginCheck checkData = new SysLoginCheck(username,ob,ip);
                sysLoginCheckDao.insert(checkData);
            }
        }
        return AjaxResult.success();
    }
}
